#include <iostream>
#include <stdio.h>
#include <string.h>
#include "../inc/Image.h"

extern int __winY;

/* A MODIFIER CEST POUR OIR LE TEST SUR LZ ZOOM */
extern float __zoomX;
extern float __zoomY;

using namespace std;

Image::Image()
{
	data = NULL;
}

Image::Image(int _width, int _height)
{
	width = _width;
	height = _height;
	data = (GLubyte*) malloc ( 3 * _width * _height * sizeof(GLubyte) );
}

Image::~Image()
{
	
}

int Image::getHeight()
{
	return height;
}

int Image::getWidth()
{
	return width;
}

void Image::setHeight(int _h)
{
	height = _h;
}

void Image::setWidth(int _w)
{
	width = _w;
}

void Image::setData(int _i, GLubyte _n)
{
	data[_i] = _n;
}

void Image::clear()
{
	width = 0;
	height = 0;
	free(data);
}

void Image::allocMemory(int _w, int _h)
{
	width = _w;
	height = _h;
	data = (GLubyte*) malloc ( 3 * _w * _h * sizeof(GLubyte) );
}

int Image::loadPPM( const char* _name)
{
	FILE* f;
	char MagicNumber[3];
	char p3[3] = { 'P', '3' , 0 };
	int couleurmax = 255;
	int i, largeur, hauteur;
	int temp;
	  
	f = fopen ( _name, "r" );
	if ( f == NULL )
	{
		std::cout<<"Erreur lors de l'ouverture du fichier \""<<_name<<"\" !"<<std::endl;
		fclose ( f );
		return -1;
	}
	
	/* On recupere le MagicNumber du fichier : */
	if ( fscanf(f,"%s",MagicNumber) == 0 )
	{
		std::cout<<"Erreur de lecture du MagicNumber"<<std::endl;
		fclose ( f );
		return -1;
	}
	
	/* On verifie qu'il s'agit bien d'une image .ppm grace au magic number : */
	if ( strcmp(MagicNumber, p3 ) != 0 )
	{
		/* si ca n'en est pas une */
		std::cout<<"MagicNumber : "<<MagicNumber<<std::endl;
		std::cout<<"Erreur : L'image \""<<_name<<"\" n'est pas une image .ppm"<<std::endl;
		fclose ( f );
		return -1;
	}
		
	/* on recupere les largeurs et hauteurs  de l'image */
	if ( fscanf(f,"%d",&largeur) == EOF )
	{
		std::cout<<"Erreur de lecture de la largeur"<<std::endl;
		fclose ( f );
		return -1;
	}
	
	if ( fscanf(f,"%d",&hauteur) == EOF )
	{
		std::cout<<"Erreur de lecture de la hauteur"<<std::endl;
		fclose ( f );
		return -1;
	}
	
	if ( fscanf(f,"%d ",&couleurmax) == EOF )
	{
		std::cout<<"Erreur de lecture de la couleur maximum"<<std::endl;
		fclose ( f );
		return -1;
	}
	
	/* On alloue la memoire a l'image */
	this->allocMemory( largeur, hauteur );
	
	/* on commence la lecture jusqu'a la fin du fichier */
	for ( i = 0 ; i < largeur * hauteur * 3 ; i++ )
	{
		if ( fscanf(f,"%d",&temp) == EOF )
		{
			std::cout<<"Erreur de lecture du pixel "<<i/3<<std::endl;
			fclose ( f );
			return -1;
		}
		
		this->setData(i, (GLubyte)temp );
	}
			
	fclose ( f );
	cout<<"Chargement de "<<_name<<" effectue"<<endl;
	
	return 0;
}

void Image::display()
{
	glRasterPos2i(0,__zoomY*height);
	glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
	glPixelZoom(__zoomX,-__zoomY);
	glDrawPixels ( width, height, GL_RGB,  GL_UNSIGNED_BYTE, data );
}

void Image::display(int _x, int _y)
{
	glRasterPos2i(_x,_y);
	glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
	glPixelZoom(__zoomX,-__zoomY);
	glDrawPixels ( width, height, GL_RGB,  GL_UNSIGNED_BYTE, data );
}
